该类是一个读写锁的改进,它的思想是读写锁中读不仅不阻塞读,同时也不应该阻塞写。
读不阻塞写的实现思路:
在读的时候如果发生了写,则应当重读而不是在读的时候直接阻塞写!
因为在读线程非常多而写线程比较少的情况下,写线程可能发生饥饿现象,也就是因为大量的读线程存在并且读线程都阻塞写线程,
因此写线程可能几乎很少被调度成功!当读执行的时候另一个线程执行了写,则读线程发现数据不一致则执行重读即可。所以读写都存在的情况下,
使用StampedLock就可以实现一种无障碍操作,即读写之间不会阻塞对方,但是写和写之间还是阻塞的!
程序举例:
public class Point { //一个点的x,y坐标 private double x,y; /**Stamped类似一个时间戳的作用,每次写的时候对其+1来改变被操作对象的Stamped值 * 这样其它线程读的时候发现目标对象的Stamped改变,则执行重读*/ private final StampedLock stampedLock = new StampedLock(); |